home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 March / EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso / earcd / util2 / hexdump.lha / hexdump / hexprint.c < prev    next >
C/C++ Source or Header  |  1995-11-18  |  6KB  |  173 lines

  1. /***************************************************************************
  2. *
  3. *   Copyright P.J.Ruczynski 1990
  4. *   This software is free for redistribution and re-use as long as this
  5. *   copyright is included in all source files. This software is supplied
  6. *   as is and no responsibilty is taken by the author for any problems
  7. *   arising from this code.
  8. *
  9. * File name        -  hexprint.c
  10. *
  11. * Module name        -  HEXPRINT
  12. *
  13. * Author        -  P.J.Ruczynski    <pjr@pyra.co.uk>
  14. *
  15. * First Release        -  16 Feb 1990
  16. *
  17. * Version number    -  1.4
  18. *
  19. * Description        -  A hexadecimal printing routine, will print the 
  20. *                          given buffer with the hex on the left and the 
  21. *                          ascii on the right.
  22. *
  23. *            Revision List
  24. *
  25. * pjr    08.05.89    Added offset numbering. This can be compiled out for
  26. *            optimum performance.
  27. *
  28. * pjr    11.05.89    Added compressed output format. This can be compiled
  29. *            out for optimum performance.
  30. *
  31. * pjr    02.08.89    Changed the bcopy and bcmp routines to use defines 
  32. *                       defined  in hexprint.h and controlled by compilation 
  33. *                       flag 'ATT'. With this defined att routines are used, 
  34. *                       default means bsd routines are used. Note that the 
  35. *                       compression stuff uses BCMP and BCOPY.
  36. *
  37. * pjr    04.08.89    Added output to file capability. This can be compiled 
  38. *                       in by defining the H_FILEIO flag. Note that you also 
  39. *                       have to have a file open with an fd of lfp, although 
  40. *                       this can be changed by changing the decn below.
  41. *
  42. **************************************************************************/
  43. #include <stdio.h>
  44. #include "hexprint.h"
  45.  
  46. #ifdef H_FILEIO
  47. extern FILE *lfp;
  48. #else
  49. #define lfp stdout
  50. #endif /* H_FILEIO */
  51.  
  52. #ifdef H_COMPRESS
  53. int hex_compression = FALSE;    /* compression is off as a default */
  54. #endif /* H_COMPRESS */
  55.  
  56. #ifdef H_OFFSETS
  57. int offset_print = FALSE;    /* only print offsets on request */
  58. long offset = 0L;        /* default start offset for printing */
  59. #endif /* H_OFFSET */
  60.  
  61. /*
  62.  * hexprint
  63.  *
  64.  * routine to print a buffer out in hex form with ascii form on
  65.  * the right hand side
  66.  */
  67. /**************************************************************************/
  68. void hexprint(buf, buflen)
  69. /**************************************************************************/
  70. char *buf;    /* ptr to data part of msg req, protocol format, to print */
  71. int buflen;
  72. {
  73. int i,j;
  74. char string[H_SLEN];
  75.  
  76. #ifdef H_COMPRESS
  77. int done_compression = FALSE;    /* have we done any compression ? */
  78. char o_string[H_SLEN];        /* string prior to the current one */
  79. #endif /* H_COMPRESS */
  80.  
  81. #ifdef H_OFFSETS
  82. long o;
  83.     if (offset_print)
  84.     {
  85.         o = offset;
  86.         fprintf(lfp,"%5x  ",o);
  87.     }
  88. #endif /* H_OFFSETS */
  89.  
  90.     for (i=0; i<buflen; i++) {
  91.         string[i%H_SLEN] = *buf++;
  92.         if (i%H_SLEN == (H_SLEN-1)) {
  93. #ifdef H_OFFSETS
  94.             o += H_SLEN;
  95. #endif /* H_OFFSETS */
  96. #ifdef H_COMPRESS
  97.             if (hex_compression)
  98.                 if (i == (H_SLEN-1)) /* first time around ? */
  99.                     BCOPY(string, o_string, H_SLEN);
  100.                 else
  101.                 {
  102.  
  103.                 if (BCMP(o_string, string, H_SLEN) == 0)
  104.                     {
  105.                         fprintf(lfp,"* ");
  106.                         done_compression = TRUE;
  107.                         BCOPY(string, o_string, H_SLEN);
  108.                         continue;
  109.                     }
  110.                     else if (done_compression)
  111.                     {
  112.                         fprintf(lfp,"\n");
  113. #ifdef H_OFFSETS
  114.                         if (offset_print)
  115.                             fprintf(lfp, "%5x  ",o - H_SLEN);
  116. #endif /* H_OFFSETS */
  117.                         done_compression = FALSE;
  118.                     }
  119.                     BCOPY(string, o_string, H_SLEN);
  120.                 }
  121. #endif /* H_COMPRESS */
  122.             for (j=0; j<H_SLEN; j++)
  123.                 fprintf(lfp, "%2x ",(unsigned char)string[j]);
  124.  
  125.             for (j=0; j<H_SLEN; j++)
  126.                 if (string[j] >= 0x20 && string[j] <= 0x7e)
  127.                     fprintf(lfp, "%c",string[j]);
  128.                 else
  129.                     fprintf(lfp, ".");
  130.             fprintf(lfp, "\n");
  131. #ifdef H_OFFSETS
  132.             if ((i != (buflen -1)) && offset_print)
  133.                 fprintf(lfp, "%5x  ",o);
  134. #endif /* H_OFFSETS */
  135.         } else
  136.             if ((i%H_SLEN < (H_SLEN-1)) && (i == buflen-1)) {
  137. #ifdef H_COMPRESS
  138.                 if (done_compression)
  139.                 {
  140.                     fprintf(lfp, "\n");
  141. #ifdef H_OFFSETS
  142.                     if (offset_print)
  143.                         fprintf(lfp, "%5x  ",o);
  144. #endif /* H_OFFSETS */
  145.                     done_compression = FALSE;
  146.                 }
  147.                 BCOPY(string, o_string, H_SLEN);
  148. #endif /* H_COMPRESS */
  149.                 for (j=0; j<=(i%H_SLEN); j++)
  150.                     fprintf(lfp, "%2x ",(unsigned char)string[j]);
  151.  
  152.                 for (j=0; j<((H_SLEN-1)-(i%H_SLEN)); j++)
  153.                     fprintf(lfp, "   ");
  154.  
  155.                 for (j=0; j<=(i%H_SLEN); j++)
  156.                     if (string[j] >= 0x20 &&
  157.                         string[j] <= 0x7e)
  158.                         fprintf(lfp, "%c",string[j]);
  159.                     else
  160.                         fprintf(lfp, ".");
  161.  
  162.                 fprintf(lfp, "\n");
  163.             }
  164.     } /* end of for */
  165.  
  166. #ifdef H_COMPRESS
  167.     if (done_compression)
  168.         fprintf(lfp, "\n");
  169. #endif /* H_COMPRESS */
  170.  
  171. } /* end of hexprint */
  172.  
  173.